package logica.pessoa;

import logica.util.Endereco;


/**
 * Pessoa Juridica
 * 
 * A classe Pessoa Jurica guarda informacoes importantes sobre empresas
 * como CNPJ, razao social, inscricao estadual
 * 
 * @author Jose Arthur Morais (Tabira)
 * @since 15/10/2010
 *
 */
public class PessoaJuridica extends Pessoa{

	private String CNPJ;
	private String razaoSocial;
	private String inscricaoEstadual;
	
	
	/**
	 * Contrutor de Pessoa Juridica
	 * 
	 * @param String nomeFantasia
	 * @param String telefone
	 * @param String email
	 * @param String endereco
	 * @param String cnpj
	 * @param String razaoSocial
	 * @param String inscricaoEstadual
	 * 
	 * @throws Exception O CNPJ deve obedecer o formato XX.XXX.XXX-XXXX/XX e X so devera ser um digito
	 * @throws Exception A razao social naum pode ter numero e tem que ser maior que 10 caracteres
	 * @throws Exception A inscricao estadual deve ter o formato XXX.XXX.XXX.XXX onde X sao inteiros
	 * 
	 * @see Pessoa
	 * @see PessoaFisica
	 * @see Usuario
	 * @see Gerente
	 * @see Funcionario
	 * @see Cliente
	 */
	public PessoaJuridica(String nomeFantasia, String telefone, String email, Endereco endereco, String cnpj, String razaoSocial, String inscricaoEstadual) throws Exception{
		super ( nomeFantasia, telefone, email, endereco);
		
		setCNPJ(cnpj);
		setRazaoSocial(razaoSocial);
		setInscricaoEstadual(inscricaoEstadual);
		
		
		
	}
	
	/**
	 * Consulta CNPJ
	 * O CNPJ eh o cadastro nacional de pessoa juridica, numero que referencia a empresa em ambito nacional
	 * 
	 * @return String CNPJ
	 */
	public String getCNPJ() {
		return CNPJ;
	}
	
	/**
	 * Muda o CNPJ da empresa 
	 * 
	 * @param String cnpj
	 * @throws Exception 
	 * 
	 * @throws Exception O CNPJ deve obedecer o formato XX.XXX.XXX-XXXX/XX e X so poderar ser um digito
	 * @throws Exception Cada Pessoa juridica deve ter CNPJ exclusivo
	 */
	public void setCNPJ(String cnpj) throws Exception {
		try{
			String cnpjDividido [] = new String [5];
			
			cnpjDividido[0] = cnpj.split(".")[0];
			cnpjDividido[1] = cnpj.split(".")[1];
			cnpjDividido[2] = cnpj.split(".")[2].split("-")[0];
			cnpjDividido[3] = cnpj.split(".")[2].split("-")[1].split("/")[0];
			cnpjDividido[4] = cnpj.split(".")[2].split("-")[1].split("/")[1];
			
			if (cnpj.length() != 18 || cnpjDividido[0].length() != 2 || cnpjDividido[1].length() != 3 || cnpjDividido[2].length() != 3 || cnpjDividido[3].length() != 4 || cnpjDividido[4].length() != 2)
				throw new Exception ("Formato CNPJ: XX.XXX.XXX-XXXX/XX");
			
			if ( ! stringSoTemDigito(cnpjDividido[0]) || ! stringSoTemDigito(cnpjDividido[1]) || ! stringSoTemDigito(cnpjDividido[2]) || ! stringSoTemDigito(cnpjDividido[3]) || ! stringSoTemDigito(cnpjDividido[4]))
				throw new Exception ("CNPJ contem caracteres invalidos");
		
			CNPJ = cnpj;
		}
	

		catch (Exception e) {
			throw new Exception ("Formato CNPJ: XX.XXX.XXX-XXXX/XX");
		}
	}
	
	/**
	 * Consulta razao social
	 * Razao Soial eh o nome pelo qual a pessoa exerce as atividades da empresa 
	 * 
	 * @return String razao social
	 */
	public String getRazaoSocial() {
		return razaoSocial;
	}
	
	/**
	 * Muda a razao social
	 * 
	 * @param String razaoSocial
	 * @throws Exception A razao social naum pode ter numeto e tem que ser maior que 10 caracteres
	 */
	public void setRazaoSocial(String razaoSocial) throws Exception {
		if (razaoSocial == null || stringTemDigito(razaoSocial) || razaoSocial.length() <= 10)
			throw new Exception ("razao social invalida");
		
		this.razaoSocial = razaoSocial;
	}
	
	/**
	 * Consulta a inscricao estadual
	 * A inscricao estadual e um numero usado pelo estado para referenciar a empresa
	 * o numero tem 12 digitos separados tres a tres por ponto
	 * e cada sequencia referencial uma caracteristica da empresa.
	 * 
	 * @return String inscricao estadual
	 */
	public String getInscricaoEstadual() {
		return inscricaoEstadual;
	}
	
	/**
	 * Muda a inscricao estadual 
	 * 
	 * @param String inscricaoEstadual
	 * 
	 * @throws Exception A inscricao estadual deve ter o formato XXX.XXX.XXX.XXX onde X sao inteiros
	 * @throws Exception Cada Pessoa juridica deve ter um numero de inscricao estadual exclusivo
	 */
	public void setInscricaoEstadual(String inscricaoEstadual) throws Exception {
		
		try{
			String inscricaoDividida [] = inscricaoEstadual.split("."); 
		
			if (inscricaoEstadual.length() != 15 || inscricaoDividida[0].length() != 3 || inscricaoDividida[1].length() != 3 || inscricaoDividida[2].length() != 3 || inscricaoDividida[3].length() != 3)
				throw new Exception ("Formato invalido");
			
			if ( ! stringSoTemDigito(inscricaoEstadual.replace(".", "")))
				throw new Exception ("Inscricao Estadual so comtem caractere invalido");
				
			this.inscricaoEstadual = inscricaoEstadual;
		}
		
		
		catch (Exception e) {
			throw new Exception ("Formato invalido");
		}
	}

	/**
	 * Compara igualdade de Pessoa Juridica
	 * 
	 * @return boolean true se CNPJ for igual
	 */
	public boolean equals(Object object){
		if ( ! (object  instanceof  PessoaJuridica))
			return false;
		
		return CNPJ.equals(((PessoaJuridica)object).getCNPJ());
	}

	/**
	 * Representa a Pessoa Juridica em um formato de String
	 */
	public String toString(){
		return "CNPJ: " + CNPJ + "\nRazao Social: " + razaoSocial + "\nInscricao Estadual: " + inscricaoEstadual;
	}
}
